/**
 * 姓名脱敏，只保留第一个字（姓），其余用 * 替代
 * @param name 原始姓名
 * @returns 脱敏后的姓名
 */
export function maskName(name: string): string {
  if (!name)
    return '';
  const str = name.trim();
  if (str.length <= 1)
    return str; // 单字名无需脱敏
  return str[0] + '*'.repeat(str.length - 1);
}

/**
 * 对家庭住址进行脱敏处理
 * @param address 原始地址字符串
 * @param visibleHead 头部可见字符数（可选，默认值可能为6）
 * @param visibleTail 尾部可见字符数（可选，默认值可能为0）
 * @param maskSymbol 脱敏替代符号（可选，默认为'*'）
 * @returns 脱敏后的地址字符串
 */
export function desensitizeAddress(
  address: string,
  visibleHead?: number,
  visibleTail?: number,
  maskSymbol: string = '*'
): string {
  // 处理空值或无效输入
  if (!address || address.length === 0) {
    return address;
  }

  const head = visibleHead ?? 6; // 默认展示前6个字符（通常到区一级）
  const tail = visibleTail ?? 0; // 默认尾部不保留

  // 若地址长度较短，则直接返回全部或部分脱敏
  if (address.length <= head + tail) {
    // 可根据需要决定如何处理短地址，例如全部显示或部分脱敏
    // 这里选择显示前head字符，其余用maskSymbol替代
    return address.substring(0, head) + maskSymbol.repeat(Math.max(0, address.length - head));
  }

  // 拼接脱敏后的地址：可见头部 + 脱敏部分 + 可见尾部
  const headPart = address.substring(0, head);
  const tailPart = tail > 0 ? address.substring(address.length - tail) : '';
  const maskedLength = address.length - head - tail;
  const maskedPart = maskSymbol.repeat(maskedLength);

  return headPart + maskedPart + tailPart;
}

export function smartAddressMasking(address: string): string {
  // eslint-disable-next-line regexp/no-unused-capturing-group, regexp/no-super-linear-backtracking
  const regex = /^((.*?[省市自治区])(.*?[市区县]))(.*)$/;
  const match = regex.exec(address);

  if (match) {
    // 保留省、市、区信息，详细部分脱敏
    const [, basicPart, , , detailPart] = match;
    return basicPart + detailPart.replace(/./g, '*'); // 将详细部分全部替换为*
  }
  // 如果正则不匹配，退回通用脱敏方法
  return desensitizeAddress(address, 6, 0);
}

/**
 * 身份证号脱敏 (正则实现)
 * @param idCard 身份证号字符串
 * @returns 脱敏后的字符串，格式为：前6位 + ****** + 后4位
 */
export function maskIdCardRegExp(idCard: string): string {
  const reg = /^(.{6})\d+(.{4})$/;
  return idCard.replace(reg, '$1******$2');
}
